﻿using System;

namespace _100_Lambda表达式_捕获外部变量_捕获循环变量
{
    class Program
    {
        static void Main(string[] args)
        {
            // 当捕获for或foreach语句中的循环变量时，C#把这些循环变量看作时声明在循环外部的。这表明每个循环捕获的时相同的变量。
            //下面的程序输出333而不是012：
            Action[] actions = new Action[3];
            for (int i = 0; i < 3; i++)
                actions[i] = () => Console.Write(i);
            foreach (Action a in actions) a(); // 333

            //每个闭包捕获相同的变量i，（如果变量i在循环中保持不变，则非常有用；甚至可以根据需要在循环体中显式修改i的值。）每个委托在调用时才看到i值，此时，i值为3。把for循环展开更容易理解：
            /*
            Action[] actions = new Action[3];
            int i = 0;
            actions[0] = () => Console.Write(i);
            i = 1;
            actions[1] = () => Console.Write(i);
            i = 2;
            actions[2] = () => Console.Write(i);
            i = 3;
            foreach (Action a in actions) a();
            */

            //结论是，如果希望输出012，需要把循环变量指定到循环内的局部变量中。
            Action[] actions_1 = new Action[3];
            for (int i = 0; i < 3; i++)
            {
                int loopScopedi = i;
                actions_1[i] = () => Console.Write(loopScopedi);
            }
            foreach (Action a in actions_1) a(); //012
            //这将导致闭包在每次循环中捕获不同的变量。
            Console.ReadKey();
        }
    }
}